// processa.cc
#include "comm.hpp"

int main()
{
    // int shmid = Createshm();  // 创建共享内存
    int shmid = Getshm();  // 获取共享内存
    log(Debug, "create shm done");
    char *shmaddr = (char*)shmat(shmid, nullptr, 0);  // 把指定的共享内存挂接到当前进程
    log(Debug, "attach shm done, shmaddr: 0x%x", shmaddr);

    Init init;  // 创建管道文件
    // 打开管道文件
    int fd = open(FIFO_FILE, O_RDONLY);
    if (fd < 0)
    {
        log(Fatal, "error string: %s, error code: %d", strerror(errno), errno);
        exit(FIFO_OPEN_ERR);
    }
    log(Info, "server open file done, error string: %s, error code: %d", strerror(errno), errno);

    // ipc code, 读端
    // 一旦有人把数据写入到共享内存，我们立马就能看到了，不需要经过系统调用
    // struct shmid_ds shmds;
    while (true)
    {
        char c;
        ssize_t s = read(fd, &c, 1);  // 读到内容，才会继续往后运行
        if (s == 0) break;  // 读到文件结尾
        else if (s < 0) break;

        cout << "client say@ " << shmaddr;  // 直接访问共享内存，当做字符串读出来
        sleep(1);

        // shmctl(shmid, IPC_STAT, &shmds);
        // cout << "shm size:" << shmds.shm_segsz << endl;
        // cout << "shm nattch:" << shmds.shm_nattch << endl;
        // printf("shm key: 0x%x\n", shmds.shm_perm.__key);  // %x十六进制
        // printf("shm mode: %o\n", shmds.shm_perm.mode);  // %o八进制
    }

    shmdt(shmaddr);  // 去关联
    log(Debug, "detach shm done, shmaddr: 0x%x", shmaddr);
    shmctl(shmid, IPC_RMID, nullptr);  // 释放共享内存
    log(Debug, "destory shm done");
    
    // 关闭信道
    close(fd);

    log(Debug, "processa quit...");
    return 0;
}